ASP.NET MVC 4とAWS Elastic Beanstalkで簡単なWeb APIを作成する

ASP.NET MVC 4とAWS Elastic Beanstalkで簡単なWeb APIを作成する

Clock Icon2013.11.05

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

簡単なWeb APIの作成

とあるブログを執筆するために、簡単なWeb APIを作成する必要がありました。特定のURLをたたくと、特定のHTTPのレスポンスコードを返すようなWeb APIです。

そこで今回はASP.NET MVC 4を用いて簡単なWeb APIを作成することにします。また、アプリケーション以外のインフラ全般はAWS Elastic Beanstalkにすべて任せることにしました。

AWS Elastic BeanstalkとはAWS版のPaaS環境のようなもので、開発者はEclipse(Java)、Visual Studio(C#)、Rubyなどを用いたアプリケーション開発に専念し、AWS環境の構築、アプリケーションのAWS環境へのデプロイはBeanstalkが用意した枠組みにまかせます。

・AWS Elastic Beanstalk
http://aws.amazon.com/jp/elasticbeanstalk/

 開発環境

  • Windows 8
  • Visual Studio 2012(C#)
  • AWS Tools for Visual Studio (2012)

※執筆時点(2013/11/05)でAWS Tools for Visual StudioがVisual Studio 2013に対応していなかったので、Visual Studio、AWS Tools for Visual Studioをそれぞれ2012版を利用しています。

ASP.NET MVC 4 Webアプリケーションの作成

まずはASP.NET MVC 4のWebアプリケーションを作成していきます。プロジェクトの新規作成で「AWS.NET MVC 4 Web アプリケーション」を選択します。プロジェクト名は「ErrorCodeMVCApplication」としています。

Error Code Mvc Application 01

次に、プロジェクトのテンプレートを選択します。今回は画面は不要なので、空のテンプレートとします。同じく画面は不要ですが、ビューエンジンをデフォルトのRazorとしています。

Error Code Mvc Application 02

ASP.NET Web APIのアセンブリの追加

今回はASP.NET Web APIでWeb APIを作成するので、ASP.NET Web APIのアセンブリを追加しておきます。プロジェクトを右クリックし、NuGetパッケージの管理で下記のようにASP.NET Web APIを追加します。下記ではオンライン検索で「WebApi」を検索しています。

Error Code Mvc Application 03

(※Web APIアプリケーション作成が初回なので上記のアセンブリを追加しています)

コントローラの追加

今回はMVCのMとVは作りませんがControllerに関しては作成します。プロジェクトのControllersフォルダを右クリックすると、追加>コントローラが現れるので、コントローラを追加します。下記ではErrorsControllerを追加しています。

Error Code Mvc Application 04

このErrorControllerにブラウザ等でアクセスするには/api/errorsでアクセスする事ができます。

Controllersフォルダに作成したControllerにアクセスするには サーバーの/api/{ControllerのControllerより前の部分}でアクセスできます。TestControllerを作成した場合は、/api/testでアクセスできます。ASP.NET MVC 4テンプレートからWebアプリケーションを作成すると、App_Start\WebApiConfig.csとRouteConfig.csにルーティングの定義が予め行われているようです。

Getメソッドの実装

アプリケーションの詳細な実装の前に簡単なGetメソッドを作成してみましょう。

下記のコードをErrorsControllerに指定します。

namespace ErrorCodeMvcApplication.Controllers
{
    public class ErrorsController : ApiController
    {
        // GET /api/errors
        public string Get()
        {
            return "GET Success!";
        }
    }
}

これで/api/errorsにブラウザ等でアクセスすると、何らかの形式で「GET Success!」の文字列がクライアントに返却されそうですね。

アプリケーションを実行してみる

それでは、アプリケーションを実行してみることにしましょう。実行するとブラウザでローカルテストサーバーのルートにアクセスしますが、下記のように404が返って来ます。

Error Code Mvc Application 05

先ほど作成したControllerは/api/errorsでアクセスできるので、改めて/api/errorsにアクセスしてみます。すると下記のようにXML形式のレスポンスが返却されていました。

Error Code Mvc Application 06

Google ChromeのデベロッパーツールでみるとGETメソッドで200が返却されている事がわかります。

Error Code Mvc Application 07

様々なHTTPステータスコード返すアプリケーションの作成

今回は、サンプルアプリケーションとして(かなり唐突ですが)様々なHTTPステータスコードを返すアプリケーションを作成してみます。先ほど作成したErrorsControllerにメソッドを追加し、/api/errors/404のようにアクセスすると404のHTTPステータスコードが返却されるようにします。

コードは下記のようになります:

        // GET /api/errors
        public string Get(int id)
        {
            switch (id)
            {
                case 400:
                    throw new HttpResponseException(HttpStatusCode.BadRequest);
                case 403:
                    throw new HttpResponseException(HttpStatusCode.Forbidden);
                case 404:
                    throw new HttpResponseException(HttpStatusCode.NotFound);
                case 405:
                    throw new HttpResponseException(HttpStatusCode.MethodNotAllowed);
                case 414:
                    throw new HttpResponseException(HttpStatusCode.RequestUriTooLong);
                case 500:
                    throw new ApplicationException("Error type is Internal Server Error" + HttpStatusCode.InternalServerError.ToString());
                case 501:
                    throw new HttpResponseException(HttpStatusCode.NotImplemented);
                case 502:
                    throw new HttpResponseException(HttpStatusCode.BadGateway);
                case 503:
                    throw new HttpResponseException(HttpStatusCode.ServiceUnavailable);
                case 504:
                    throw new HttpResponseException(HttpStatusCode.GatewayTimeout);
                default:
                    break;
            }

Controllerを呼び出す際の引数で各種HTTPステータスコードが返るようになっています。アプリケーションを実行して/api/errors/404を実行すると、レスポンスのボディは何も返していないのブラウザ上では真っ白ですが、実際に400番のステータスコードが返却されていることがわかります。

Error Code Mvc Application 24

AWS環境へのAWS Elastic Beanstalkを通じたデプロイ

最後にアプリケーションをAWS環境へデプロイしてみたいと思います。AWS Tools for Visual Studioをインストールしてある状態で、プロジェクトを右クリックすると「Publish to AWS」メニューが現れるので、それを実行します。

最初の画面ではアカウントとアプリケーションをデプロイするテンプレートの選択を行います。下記ではAWS Elastic Beanstalkテンプレートを選択しています。

Error Code Mvc Application 09

※他のテンプレートに関しては、読者のみなさん自身で試して頂きたいと思います。

次に、Applicationの詳細を決めます。ApplicationはElastic Beanstalkでのアプリケーション管理の単位です。ここでは適当にNameとDescriptionを指定しておきます。また、Versionはアプリケーションの特定のWARファイルやZIPファイル等のアプリケーション本体を指します。下記ではデプロイ時の日時が自動的に指定されています。

Error Code Mvc Application 10

次に、Environmentの設定を行っていきます。Environmentは特定のVersionが実行される「実行環境」を表します。ここでは適当にNameとDescriptionを指定しておきます。

Error Code Mvc Application 11

次に、Environmentとしてどのような設定の実行環境にするかを決めていきます。下記では以下の要素を設定しています:

  • Container type:Windows Server 2012上のIIS 8
  • Instance type:Small
  • Key pair:指定のキーペア
  • IAM Role:デフォルトの(Beanstalkが自動生成する)IAM Role

Error Code Mvc Application 12

他にはカスタムのAMIの指定やVPCでのデプロイ設定を行うことが出来ます。

最後にアプリケーションのオプションを設定します。ここではTarget frameworkとして.NET Framework 4.5を指定しています。

Error Code Mvc Application 13

最後に「Finish」ボタンをクリックするとアプリケーションがデプロイされます。下記のようにAWS Management Consoleでデプロイ状況を確認することが出来ます。(デプロイ中は下記の矢印がぐるぐる回ります)

Error Code Mvc Application 14

ちなみに、Visual StudioのAWS Explorerでもデプロイの状況を確認することが出来ます。

Error Code Mvc Application 25

Error Code Mvc Application 15

AWS Management Consoleで緑のアイコンが表示されるとデプロイ完了です。

Error Code Mvc Application 17

AWS環境のアプリケーションへのアクセス

最後にAWS環境にデプロイされたアプリケーションに実際にアクセスしてみます。アプリケーションのURLはAWS Management Console上で確認することが出来ます。

前項の最後の図の上の方にURLが出ていて、下記のようになっていることがわかります:

http://errorcodemvcapplication.elasticbeanstalk.com

上記のURL+/api/errors/404のような形でアクセスするとHTTPのステータスコードが返ってくると思います。

最後に

今回はASP.NETとAWS Elastic Beanstalkを使って、簡単なWeb APIを作成してみました。みなさんも.NET(やJava、Ruby等)のアプリケーションを作成して、AWS Elastic Beanstalkを通じてAWSにアプリケーションをデプロイしてみては如何でしょうか。AWSの入門としては非常に簡単にAWS上でのWebアプリケーション実行まで体験することができるので、オススメです!

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.